/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.DAOS;

import Controladores.CtrlCrearGrupo;
import Controladores.CtrlUsuarios;
import DataTypes.DataAmistad;
import DataTypes.DataEvento;
import DataTypes.DataHistorial;
import DataTypes.DataMensaje;
import DataTypes.DataUsuario;
import Interfaces.Factory;
import Interfaces.ICrearGrupo;
import Interfaces.ICtrlUsuarios;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import enums.enumEvento;
import enums.enumVisibilidad;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.Date;
import java.util.logging.Logger;

/**
 *
 * @author Usuario
 */
public class DAOUsuario {
    
    public void guardarUsuarios(ArrayList<DataUsuario> listU,String pathDirect) {
        
        String ruta = (pathDirect+"\\usuarios.csv");
        CsvWriter writer = new CsvWriter(ruta);

        try {
//writer.write(String) - Escribe los campos separandolos con coma automaticamente.
            writer.write("Nombre");
            writer.write("Correo");
            writer.write("Nick");
            writer.write("Pass");
            writer.write("FechaNac");
            writer.write("Sexo");
            writer.write("Ciudad");
            writer.write("Pais");
            writer.write("Bloqueo");
            writer.write("NivelVisibilidad");
            writer.write("Imagen");
            writer.write("Notificar");
            writer.write("CambioPass");
            
//writer.endRecord() - Termina con la linea.

           
            Iterator<DataUsuario> it = listU.iterator();
            DataUsuario da;
            while (it.hasNext()) {
                da = it.next();
                writer.endRecord();
                writer.write(da.getNombre());
                writer.write(da.getCorreo());
                writer.write(da.getNick());
                writer.write(da.getContrasena());
                int dia = da.getFechaNac().get(Calendar.DAY_OF_MONTH);
                int mes = da.getFechaNac().get(Calendar.MONTH);
                int anio = da.getFechaNac().get(Calendar.YEAR);
                writer.write(dia+"-"+mes+"-"+anio);
                writer.write(da.getSexo());
                writer.write(da.getCiudad());
                writer.write(da.getPais());
                if (da.getBloqueo()) {
                    writer.write("true");
                } else {
                    writer.write("false");
                }
                writer.write(da.getNivelVisibilidad().toString());
                writer.write(da.getImagen());
                
                if(da.isNotificar())
                    writer.write("true");
                else 
                    writer.write("false");
                writer.write(String.valueOf(da.isCambioPass()));
                           
            }

        } catch (IOException e) {

// TODO Auto-generated catch block

            e.printStackTrace();

        } finally {

            writer.close();
           

        }

    }

    public void guardarAmistad(ArrayList<DataUsuario> listU,String pathDirect){
           String ruta = (pathDirect+"\\amistades.csv");
        try {
            Iterator<DataUsuario> it2 = listU.iterator();
            Iterator<DataAmistad> itAmigos;
            ArrayList<DataAmistad> amigos;
            DataAmistad amig;
            DataUsuario du;
            HashMap<String, DataAmistad> amistades = new HashMap<String, DataAmistad>();

            CsvWriter writer = new CsvWriter(ruta);
            writer.write("amigo1");
            writer.write("amigo2");
            writer.write("fechaInicio");
            while (it2.hasNext()) {

                du = it2.next();
                amigos = du.getAmigos();
                itAmigos = amigos.iterator();
                while (itAmigos.hasNext()) {

                    amig = itAmigos.next();
                    if (!amistades.containsKey(amig.getAmigo1().getCorreo() + amig.getAmigo2().getCorreo()) && !amistades.containsKey(amig.getAmigo2().getCorreo() + amig.getAmigo1().getCorreo())) {
                        amistades.put(amig.getAmigo1().getCorreo() + amig.getAmigo2().getCorreo(), amig);
                        writer.endRecord();
                        writer.write(amig.getAmigo1().getCorreo());
                        writer.write(amig.getAmigo2().getCorreo());
                        int dia = amig.getFechaInicio().get(Calendar.DAY_OF_MONTH);
                        int mes = amig.getFechaInicio().get(Calendar.MONTH);
                        int anio = amig.getFechaInicio().get(Calendar.YEAR);
                        writer.write(dia + "-" + mes + "-" + anio);
                    }
                }
            }
            writer.close();
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
       
    }
    
    public ArrayList<DataUsuario> cargarUsuarios(String path){
       
        String ruta = path+"\\usuarios.csv";
        ArrayList<DataUsuario> list = new ArrayList<DataUsuario>();
        try {
            CsvReader usuarios = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));


            usuarios.readHeaders();

            while (usuarios.readRecord()) {
                String correo = usuarios.get("Correo");
                String nombre = usuarios.get("Nombre");
                String nick = usuarios.get("Nick");
                String pass = usuarios.get("Pass");
                String sexo = usuarios.get("Sexo");
                String ciudad = usuarios.get("Ciudad");
                String fechaNac = usuarios.get("FechaNac");
                
                 DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy");
                Date date = dateforma.parse(fechaNac);
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                
                String pais = usuarios.get("Pais");
                String bloqueo = usuarios.get("Bloqueo");
                String visibilidad = usuarios.get("NivelVisibilidad");
                String imagen = usuarios.get("Imagen");
                boolean notificar;
                if(usuarios.get("Notificar").equals("true"))
                    notificar = true;
                else notificar = false;
                
                boolean bloq;
                if(bloqueo.equals("true"))
                    bloq = true;
                else
                    bloq = false;
                boolean cambioPass;
                 if(usuarios.get("CambioPass").equals("true"))
                    cambioPass = true;
                 else cambioPass = false;
                // perform program logic here
               DataUsuario dt = new DataUsuario(correo, nombre, nick, pass,cal, sexo, ciudad, pais, bloq, enumVisibilidad.valueOf(visibilidad),imagen,notificar,cambioPass);
               list.add(dt);
            }

            usuarios.close();
//            cargarHistorial(path);
        
        } catch (ParseException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
            
        return list;   
        
    }

    public void cargarAmistades(String path) {
        try {
            String ruta = path+"\\amistades.csv";
            ArrayList<DataUsuario> list = new ArrayList<DataUsuario>();
            CsvReader amistad = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
            amistad.readHeaders();

            ICtrlUsuarios usu = new CtrlUsuarios();
            DataUsuario us1;
            DataUsuario us2;
            
            while (amistad.readRecord()) {
                String amigo1 = amistad.get("amigo1");
                String amigo2 = amistad.get("amigo2");
                String fechaInicio = amistad.get("fechaInicio");
                 DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy");
                Date date = dateforma.parse(fechaInicio);
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                usu.AgregarAmigo(amigo1, amigo2, cal);
            }

            amistad.close();
            
         } catch (ParseException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public void cargarEventosUsuario(String path){
        String ruta = path+"\\EventosAsoc.csv";
        try {
            CsvReader eventos = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
            eventos.readHeaders();
            ICtrlUsuarios usu = new CtrlUsuarios();
            ICrearGrupo gru = new CtrlCrearGrupo();
            
            while(eventos.readRecord())
            {
                String usuario = eventos.get("Usuario");
                String evento = eventos.get("Evento");
                DataEvento de =  cargarEventos(usuario, evento,path);
                if(usu.containsKey(usuario))
                    usu.agregarEvento(de, usuario);
                else
                    gru.agregarEvento(de, usuario);
                    
            }            
            eventos.close();
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }

            
        
    }
    
    public DataEvento cargarEventos(String usu, String even,String path){
        
        String ruta = path+"\\eventos.csv";
        DataEvento de = null;
              try {
            CsvReader usuEventos = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
            usuEventos.readHeaders();
            boolean esta = false;
              while (!esta && usuEventos.readRecord())
              {
                      if(usuEventos.get("nombre").equals(even) && usuEventos.get("asociadoA").equals(usu)){
                          esta = true;
                      }
               
            }    
                boolean rep;
                ArrayList<String> fech = new ArrayList<String>();
                String nombre = usuEventos.get("nombre");
                String tipo = usuEventos.get("tipoEvento");
                String repetible = usuEventos.get("repetible");
                String autor = usuEventos.get("autor");
                if(repetible.equals("true"))
                    rep = true;
                else rep = false;
                String fecha = usuEventos.get("fecha");
                Calendar cal = Calendar.getInstance();
                
                if(repetible.equals("true")){
                      String res[] = fecha.split(";");
                      int i = res.length;
                      while (i != 0) {
                          fech.add(res[i - 1]);
                          i--;
                      }
                  }
                else{
                DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy-HH:mm");
                Date date = dateforma.parse(fecha);
                cal.setTime(date);
                }
                
                   
               de  = new DataEvento(nombre,enumEvento.valueOf(tipo),rep,cal,fech,Factory.getInstance().getUsuarios().getUsuario(autor));
               
               usuEventos.close();
               
        } catch (ParseException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return de;
    }
    
    public void guardarHistorial(String path){
        
        ArrayList<DataUsuario> listU = Factory.getInstance().getUsuarios().listarDUsuarios();
        Iterator<DataUsuario> itUsu = listU.iterator();
        DataUsuario du;
        try {
            String ruta = (path+"\\Historiales.csv");
            
            CsvWriter writer = new CsvWriter(ruta);
               writer.write("Usuario1");
               writer.write("Usuario2");
               writer.write("RefMensaje");
          
            while (itUsu.hasNext()) {

                du = itUsu.next();

                Iterator<DataHistorial> it = du.getHistorial().iterator();

                while (it.hasNext()) {
                    writer.endRecord();
                    DataHistorial dhis = it.next();
                    writer.write(du.getCorreo());
                    writer.write(dhis.getIdAmigo());
                    writer.write(du.getCorreo() + dhis.getIdAmigo());
                    ArrayList<DataMensaje> mens = dhis.getMensajes();
                    Iterator<DataMensaje> mensIt = mens.iterator();
                   
                }
            }
                writer.close();
            guardarMensajes(path);
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    public void guardarMensajes(String path) {
        try {
            String ruta = (path+"\\Mensajes.csv");
              
            CsvWriter writer = new CsvWriter(ruta);
                  writer.write("Referencia");
                  writer.write("Emisor");
                  writer.write("Mensaje");
                  writer.write("Fecha");
                  
            Iterator<DataUsuario> itUsu = Factory.getInstance().getUsuarios().listarDUsuarios().iterator();
            
            while(itUsu.hasNext())
            {
                DataUsuario du = itUsu.next();
                Iterator<DataHistorial> itH = du.getHistorial().iterator();

                while(itH.hasNext())
                {
                    DataHistorial dhis = itH.next();
                    Iterator<DataMensaje> it = dhis.getMensajes().iterator();
                    while (it.hasNext()) {

                        writer.endRecord();
                        DataMensaje dmen = it.next();
                        writer.write(du.getCorreo()+dhis.getIdAmigo());
                        writer.write(dmen.getEmisor());
                        writer.write(dmen.getMsj());
                        int dia = dmen.getFecha().get(Calendar.DAY_OF_MONTH);
                        int mes = dmen.getFecha().get(Calendar.MONTH);
                        int anio = dmen.getFecha().get(Calendar.YEAR);
                        int hora = dmen.getFecha().get(Calendar.HOUR_OF_DAY);
                        int min = dmen.getFecha().get(Calendar.MINUTE);
                        int sec = dmen.getFecha().get(Calendar.SECOND);
                        writer.write(dia + "-" + mes + "-" + anio + "-" + min + ":" + sec);


                    }
                }
            }
               writer.close();   
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    }
    public void cargarHistorial(String path){
        
         String ruta = path+"\\Historiales.csv";
        try {
            
                CsvReader usu = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
                usu.readHeaders();
                while(usu.readRecord()){
                    
                    String usuario1 = usu.get("Usuario1");
                    String usuario2 = usu.get("Usuario2");
                    String refMEnsaje = usu.get("RefMensaje");
                    
                  
                        ArrayList<DataMensaje> mensajes = cargarMensajeS(refMEnsaje,path);
                        Factory.getInstance().getUsuarios().agregarHistorial(usuario1, usuario2, mensajes);                      
                   
                    
                }
                
                
                
            } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
            }
           
         
    }

    public ArrayList<DataMensaje> cargarMensajeS(String refMEnsaje,String path) {

        ArrayList<DataMensaje> resul = new ArrayList<DataMensaje>();
         String ruta = path+"\\Mensajes.csv";
         DataMensaje dmen;
        try {
            
                CsvReader usu = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
                usu.readHeaders();
                while(usu.readRecord()){
                    
                    if(usu.get("Referencia").equals(refMEnsaje))
                    { 
                         dmen= new DataMensaje();
                         dmen.setEmisor(usu.get("Emisor"));
                         dmen.setMsj(usu.get("Mensaje"));
                         DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy-HH:mm");
                         Date date = dateforma.parse(usu.get("Fecha"));
                         Calendar cal = Calendar.getInstance();
                         cal.setTime(date);
                         dmen.setFecha(cal);
                         resul.add(dmen);
                    }
                }
             
                usu.close();
         } catch (ParseException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        return resul;
    
    }
    
}
